home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 090 / td2a.arc / TDA.LIB < prev   
Text File  |  1985-07-18  |  6KB  |  206 lines

  1.  
  2. { Turbodraw library }
  3.  
  4. type
  5.     stype = string[20];
  6.     td_str80 = string[80]; {L.P.}
  7.  
  8. const
  9.     ctlh = ^H;   { Backspace }
  10.     ctlm = ^M;   {  Return   }
  11.  
  12.  
  13. function getnum(p,q:integer):stype;    { 12/19/84 }
  14.  
  15. { Getnum allows entry of a number of Scale P and Precision Q }
  16. { The operator is not allowed to enter a number with greater }
  17. { precision and/or scale.  Character delete using the back-  }
  18. { space key can be used.                                     }
  19.  
  20. var
  21.     i      : integer;
  22.     number : stype;       { Input buffer }
  23.     digit  : char;
  24.     frac   : integer;
  25.     dp     : boolean;
  26.  
  27. begin
  28.     I:=1;
  29.     Dp:=false;
  30.     Frac:=0;
  31.     Digit:=' ';
  32.     Number:=' ';
  33.  
  34.     while Digit <> ctlm do
  35.         begin          { don't exit until a CR is entered }
  36.         read(kbd,digit);
  37.         write(digit);
  38.         If Digit=ctlh Then { backspace }
  39.             If I > 1 Then
  40.                 begin
  41.                 I:=I-1;
  42.                 If Dp=TRUE Then Frac:=Frac-1;
  43.                 If Copy(Number,I,1)='.' Then
  44.                     begin     { special handling for decimal point }
  45.                     Dp:=FALSE;
  46.                     Frac:=0   { just to make sure its at zero    }
  47.                 End;
  48.                 number:=copy(number,1,i-1)+' '+copy(number,i+1,20);
  49.                 write(' ' + ctlh)     { Delete character on screen }
  50.             End
  51.             Else { If I>1 }
  52.                 write(' ');  { put cursor back }
  53.             If Digit='-' Then
  54.                 If I = 1 Then
  55.                     begin
  56.                     number:=copy(number,1,i-1)+digit+copy(number,i+1,20);
  57.                     I:=I+1;
  58.                 End
  59.                 Else
  60.                     Digit:=' ';
  61.             if digit in ['0'..'9'] then
  62.                 begin;
  63.                 If Dp=TRUE Then { we are past decimal point    }
  64.                     begin
  65.                     if (I=P+2) or (Frac = q) Then
  66.                       BEGIN {L.P.}
  67.                         write(ctlh + ' ' + ctlh);  { At full prec. }
  68.                         write(^G); {Bell} {L.P.}
  69.                       END {L.P.}
  70.                     Else
  71.                         begin
  72.                         number:=copy(number,1,i-1)+digit+copy(number,i+1,20);
  73.                         Frac:=Frac+1;
  74.                         I:=I+1;
  75.                     End
  76.                 End
  77.                 Else    { If DP }
  78.                 If I=P-Q+1 Then   { allow only a '.' }
  79.                   BEGIN {L.P.}
  80.                     write(ctlh + ' ' + ctlh);
  81.                     WRITE(^G); {L.P.}
  82.                   END {L.P.}
  83.                 Else
  84.                     begin
  85.                     number:=copy(number,1,i-1)+digit+copy(number,i+1,20);
  86.                     I:=I+1;
  87.                 End;
  88.  
  89.             End    { If verify }
  90.             Else
  91.             If Digit='.' Then
  92.                 If Dp=FALSE Then { only one decimal per number }
  93.                     begin
  94.                     number:=copy(number,1,i-1)+'.'+copy(number,i+1,20);
  95.                     I:=I+1;
  96.                     Dp:=TRUE;
  97.                 End
  98.                 Else
  99.                 Digit:=' ';  { eliminate extra decimal point }
  100.                 if not (digit in ['-','0'..'9','.',ctlh,ctlm]) then
  101.                     write(ctlh + ' ' + ctlh);
  102.             End;  { Do While }
  103.  
  104.            getnum:=number;
  105.        end;
  106.  
  107. function getreal(len,scale : integer) : real;
  108.  
  109. { GETREAL returns a number of max length LEN }
  110. { and max scale SCALE                        }
  111.  
  112. var
  113.    i,j,temp,sign  : integer;
  114.    result         : real;
  115.    digit          : char;
  116.    num            : stype;
  117.    code           : integer;
  118.  
  119. begin
  120.    num:=getnum(len,scale);
  121.    i:=length(num);
  122.    j:=1;
  123.    sign:=1;
  124.    while i > 0 do
  125.        begin
  126.        digit:=copy(num,i,1);
  127.        i:=i-1;
  128.        case digit of
  129.            '0'..'9' : begin
  130.                          val(digit,temp,code);
  131.                          result:=result+(temp*j);
  132.                          j:=j*10;
  133.                       end;
  134.            '-'      : sign:=-1;
  135.            '.'      : begin
  136.                          result:=result/j;
  137.                          j:=1;
  138.                       end;
  139.         end;
  140.     end;
  141.     getreal:=result*sign;
  142. end;
  143.  
  144. function getint(len : integer) : integer;
  145.  
  146. { GETINT returns a number of max length LEN and }
  147. { a scale of zero ( integer )                   }
  148.  
  149. var
  150.    result,code : integer;
  151.    num         : stype;
  152.  
  153. begin
  154.    val(getnum(len,0),result,code);
  155.    getint:=result;
  156. end;   { of Turbodraw Library }
  157.  
  158. { This entire function by L.P.}
  159. function getstr(w:integer):td_str80; {7/18/85}
  160.  
  161. { Getstr allows entry of a string of width w.  The operator is not allowed }
  162. { enter a string with greater width.  Character delete using the backspace }
  163. { key can be used. }
  164.  
  165. var
  166.   instr: td_str80;
  167.   i: INTEGER;
  168.   c: CHAR;
  169.  
  170. BEGIN
  171.   i := 1;
  172.   c := CHR(0);
  173.   instr := '';
  174.  
  175.   { The length of the starting string can be w only to allow for a backspace }
  176.   { after the last character. }
  177.   WHILE c <> ctlm DO
  178.     BEGIN
  179.       READ(KBD, c);
  180.       CASE c of
  181.         ctlh: {backspace}
  182.           IF i > 1 THEN
  183.             BEGIN
  184.               i := i - 1;
  185.               DELETE(instr, i, 1);
  186.               write(ctlh + ' ' + ctlh); {Delete character on screen}
  187.             END; {backspace for i > 1} {Do nothing for i = 1}
  188.         ctlm: { Return }
  189.           ;
  190.         ELSE
  191.           IF LENGTH(instr) < w
  192.             THEN
  193.               BEGIN
  194.                 WRITE(c);
  195.                 INSERT(c, instr, i);
  196.                 i := i + 1;
  197.               END
  198.             ELSE
  199.               WRITE(^G); {Bell} {End not a backspace or carriage return}
  200.       END; { case}
  201.     END; {WHILE}
  202.   getstr := instr;
  203.  
  204. END; {getstr}
  205.  
  206.